package org.zn.note.mybatis.jdbc;

import org.zn.note.mybatis.domain.CmMerchant;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 * JDBC (Java DataBase Connectivity)
 * Java定义jdbc规范，然后各个数据库厂商根据统一的规范出各自的驱动程序。
 * jdbc仅仅是一套规范接口api {@link java.sql.Driver}，各个数据库厂商出具体实现。
 * <p>
 * 这里用mysql做实验。
 * <p>
 * {@link com.mysql.jdbc.Driver}
 * 现在不用Class.forName(driver)来加载驱动类了。
 * {@link java.sql.DriverManager}
 * 有静态方法会通过SPI的方式，通过扫描所有Jar的SPI配置，加载所有驱动类。
 * 驱动类只需要加SPI配置文件就可以了。当 DriverManager.getConnection时，会加载DriverManager类并调用静态方法，加载驱动类。
 * {@link java.sql.Connection}
 * 每个Connection对象就是一个TCP链接，是一个Session，事务控制在这里。需要close！
 * {@link java.sql.Statement}
 * "声明"，发送静态SQL，并获取结果集。
 */
public class JdbcExample {

    private static String url = "jdbc:mysql://localhost:3306/test";
    private static String username = "root";
    private static String password = "root";

    // 每个Connection对象，就是一个TCP链接。close或者程序退出时，会关闭链接。
    private static Connection newConnection() throws SQLException {
        Connection conn = DriverManager.getConnection(url, username, password);
        System.out.printf("new connection info: AutoCommit[%s], Catalog[%s], Holdability[%d], NetworkTimeout[%d], Schema[%s], TransactionIsolation[%d], ClientInfo[%s]\n",
                conn.getAutoCommit(), // 默认 true
                conn.getCatalog(), // test
                conn.getHoldability(), // 2
                conn.getNetworkTimeout(), // 0
                conn.getSchema(), // null
                conn.getTransactionIsolation(), // 4
                conn.getClientInfo()); // null
        return conn;
    }

    private static List<CmMerchant> getCmMerchantById(int id) {
        final String sql = "SELECT id, merchant_no, merchant_name, agency_id, stat, create_time, update_time FROM cm_merchant Where id = ?";
        List<CmMerchant> list = new ArrayList<>();
        try (
                Connection conn = newConnection();
                PreparedStatement ps = conn.prepareStatement(sql);
        ) {
            ps.setInt(1, id);
            ResultSet rs = ps.executeQuery();
            while (rs.next()) {
                CmMerchant cmMerchant = new CmMerchant();
                cmMerchant.setId(rs.getInt("id"));
                cmMerchant.setMerchantNo(rs.getString("merchant_no"));
                cmMerchant.setMerchantName(rs.getString("merchant_name"));
                list.add(cmMerchant);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return list;
    }

    public static void main(String[] args) {
        List<CmMerchant> list = getCmMerchantById(1);
        list.stream().forEach(System.out::println);
    }
}
